// logger/logger.go
package logger

import (
	"fmt"
	"os"
	"path/filepath"
	"sync"

	"github.com/gin-gonic/gin"
	"github.com/sirupsen/logrus"
	"gopkg.in/natefinch/lumberjack.v2"
)

var (
	Log *logrus.Logger
	mu  sync.RWMutex
)

// Init 初始化日志系统
// level: debug, info, warn, error，空字符串自动选择
func Init(level string) error {
	mu.Lock()
	defer mu.Unlock()

	// 自动选择默认级别
	if level == "" {
		if isProduction() {
			level = "info"
		} else {
			level = "debug"
		}
	}

	if Log == nil {
		Log = logrus.New()
	}

	if err := setLevel(level); err != nil {
		return err
	}

	setupLogger()

	// 记录初始化信息
	Log.WithField("level", level).Info("日志系统初始化完成")
	return nil
}

// SetLevel 动态设置日志级别
func SetLevel(level string) error {
	mu.Lock()
	defer mu.Unlock()

	if Log == nil {
		return fmt.Errorf("日志系统未初始化")
	}

	oldLevel := Log.GetLevel().String()
	if err := setLevel(level); err != nil {
		return err
	}

	Log.WithFields(logrus.Fields{
		"oldLevel": oldLevel,
		"newLevel": level,
	}).Info("日志级别已更新")
	return nil
}

// GetLevel 获取当前日志级别
func GetLevel() string {
	mu.RLock()
	defer mu.RUnlock()

	if Log == nil {
		return "not initialized"
	}
	return Log.GetLevel().String()
}

// 内部方法
func setLevel(level string) error {
	logLevel, err := logrus.ParseLevel(level)
	if err != nil {
		return fmt.Errorf("无效的日志级别: %s，支持: debug, info, warn, error", level)
	}
	Log.SetLevel(logLevel)
	return nil
}

func isProduction() bool {
	g := gin.Mode() //os.Getenv("GIN_MODE")
	return g == "release" || os.Getenv("APP_ENV") == "production"
}

func setupLogger() {
	if isProduction() {
		setupProduction()
	} else {
		setupDevelopment()
	}
}

func setupProduction() {
	// JSON格式，适合日志收集
	Log.SetFormatter(&logrus.JSONFormatter{
		TimestampFormat: "2006-01-02 15:04:05",
	})

	// 创建日志目录
	os.MkdirAll("logs", 0755)

	// 文件输出配置
	fileLogger := &lumberjack.Logger{
		Filename:   filepath.Join("logs", "app.log"),
		MaxSize:    0,     // 不限制单个文件大小
		MaxBackups: 0,     // 不限制备份文件数量
		MaxAge:     7,     // 保留最近7天的文件
		Compress:   false, // 不压缩，方便查看
	}
	Log.SetOutput(fileLogger)
}

func setupDevelopment() {
	// 彩色文本，易读
	Log.SetFormatter(&logrus.TextFormatter{
		ForceColors:   true,
		FullTimestamp: true,
	})

	// 显示调用位置便于调试(显示调用位置，函数名称，行号)
	Log.SetReportCaller(true)

	// 开发环境只输出到控制台
	Log.SetOutput(os.Stdout)
}

// 便捷方法
func Debug(args ...interface{}) {
	Log.Debug(args...)
}

func Debugf(format string, args ...interface{}) {
	Log.Debugf(format, args...)
}

func Info(args ...interface{}) {
	Log.Info(args...)
}

func Infof(format string, args ...interface{}) {
	Log.Infof(format, args...)
}

func Warn(args ...interface{}) {
	Log.Warn(args...)
}

func Warnf(format string, args ...interface{}) {
	Log.Warnf(format, args...)
}

func Error(args ...interface{}) {
	Log.Error(args...)
}

func Errorf(format string, args ...interface{}) {
	Log.Errorf(format, args...)
}

func WithField(key string, value interface{}) *logrus.Entry {
	return Log.WithField(key, value)
}

func WithFields(fields map[string]interface{}) *logrus.Entry {
	return Log.WithFields(fields)
}

func WithError(err error) *logrus.Entry {
	return Log.WithError(err)
}
